<?php
/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Pdf
 * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id: Style.php 18993 2009-11-15 17:09:16Z alexander $
 */


/**
 * Style object.
 * Style object doesn't directly correspond to any PDF file object.
 * It's utility class, used as a container for style information.
 * It's used by Zend_Pdf_Page class in draw operations.
 *
 * @package    Zend_Pdf
 * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class Zend_Pdf_Style
{
	/**
	 * Fill color.
	 * Used to fill geometric shapes or text.
	 *
	 * @var Zend_Pdf_Color|null
	 */
	private $_fillColor = null;

	/**
	 * Line color.
	 * Current color, used for lines and font outlines.
	 *
	 * @var Zend_Pdf_Color|null
	 */

	private $_color;

	/**
	 * Line width.
	 *
	 * @var Zend_Pdf_Element_Numeric
	 */
	private $_lineWidth;

	/**
	 * Array which describes line dashing pattern.
	 * It's array of numeric:
	 * array($on_length, $off_length, $on_length, $off_length, ...)
	 *
	 * @var array
	 */
	private $_lineDashingPattern;

	/**
	 * Line dashing phase
	 *
	 * @var float
	 */
	private $_lineDashingPhase;

	/**
	 * Current font
	 *
	 * @var Zend_Pdf_Resource_Font
	 */
	private $_font;

	/**
	 * Font size
	 *
	 * @var float
	 */
	private $_fontSize;



	/**
	 * Create style.
	 *
	 * @param Zend_Pdf_Style $anotherStyle
	 */
	public function __construct($anotherStyle = null)
	{
		if ($anotherStyle !== null) {
			$this->_fillColor          = $anotherStyle->_fillColor;
			$this->_color              = $anotherStyle->_color;
			$this->_lineWidth          = $anotherStyle->_lineWidth;
			$this->_lineDashingPattern = $anotherStyle->_lineDashingPattern;
			$this->_lineDashingPhase   = $anotherStyle->_lineDashingPhase;
			$this->_font               = $anotherStyle->_font;
			$this->_fontSize           = $anotherStyle->_fontSize;
		}
	}


	/**
	 * Set fill color.
	 *
	 * @param Zend_Pdf_Color $color
	 */
	public function setFillColor(Zend_Pdf_Color $color)
	{
		$this->_fillColor = $color;
	}

	/**
	 * Set line color.
	 *
	 * @param Zend_Pdf_Color $color
	 */
	public function setLineColor(Zend_Pdf_Color $color)
	{
		$this->_color = $color;
	}

	/**
	 * Set line width.
	 *
	 * @param float $width
	 */
	public function setLineWidth($width)
	{
		require_once 'Zend/Pdf/Element/Numeric.php';
		$this->_lineWidth = new Zend_Pdf_Element_Numeric($width);
	}


	/**
	 * Set line dashing pattern
	 *
	 * @param array $pattern
	 * @param float $phase
	 */
	public function setLineDashingPattern($pattern, $phase = 0)
	{
		require_once 'Zend/Pdf/Page.php';
		if ($pattern === Zend_Pdf_Page::LINE_DASHING_SOLID) {
			$pattern = array();
			$phase   = 0;
		}

		require_once 'Zend/Pdf/Element/Numeric.php';
		$this->_lineDashingPattern = $pattern;
		$this->_lineDashingPhase   = new Zend_Pdf_Element_Numeric($phase);
	}


	/**
	 * Set current font.
	 *
	 * @param Zend_Pdf_Resource_Font $font
	 * @param float $fontSize
	 */
	public function setFont(Zend_Pdf_Resource_Font $font, $fontSize)
	{
		$this->_font = $font;
		$this->_fontSize = $fontSize;
	}

	/**
	 * Modify current font size
	 *
	 * @param float $fontSize
	 */
	public function setFontSize($fontSize)
	{
		$this->_fontSize = $fontSize;
	}

	/**
	 * Get fill color.
	 *
	 * @return Zend_Pdf_Color|null
	 */
	public function getFillColor()
	{
		return $this->_fillColor;
	}

	/**
	 * Get line color.
	 *
	 * @return Zend_Pdf_Color|null
	 */
	public function getLineColor()
	{
		return $this->_color;
	}

	/**
	 * Get line width.
	 *
	 * @return float
	 */
	public function getLineWidth()
	{
		return $this->_lineWidth->value;
	}

	/**
	 * Get line dashing pattern
	 *
	 * @return array
	 */
	public function getLineDashingPattern()
	{
		return $this->_lineDashingPattern;
	}


	/**
	 * Get current font.
	 *
	 * @return Zend_Pdf_Resource_Font $font
	 */
	public function getFont()
	{
		return $this->_font;
	}

	/**
	 * Get current font size
	 *
	 * @return float $fontSize
	 */
	public function getFontSize()
	{
		return $this->_fontSize;
	}

	/**
	 * Get line dashing phase
	 *
	 * @return float
	 */
	public function getLineDashingPhase()
	{
		return $this->_lineDashingPhase->value;
	}


	/**
	 * Dump style to a string, which can be directly inserted into content stream
	 *
	 * @return string
	 */
	public function instructions()
	{
		$instructions = '';

		if ($this->_fillColor !== null) {
			$instructions .= $this->_fillColor->instructions(false);
		}

		if ($this->_color !== null) {
			$instructions .= $this->_color->instructions(true);
		}

		if ($this->_lineWidth !== null) {
			$instructions .= $this->_lineWidth->toString() . " w\n";
		}

		if ($this->_lineDashingPattern !== null) {
			require_once 'Zend/Pdf/Element/Array.php';
			$dashPattern = new Zend_Pdf_Element_Array();

			require_once 'Zend/Pdf/Element/Numeric.php';
			foreach ($this->_lineDashingPattern as $dashItem) {
				$dashElement = new Zend_Pdf_Element_Numeric($dashItem);
				$dashPattern->items[] = $dashElement;
			}

			$instructions .= $dashPattern->toString() . ' '
			. $this->_lineDashingPhase->toString() . " d\n";
		}

		return $instructions;
	}

}

